package cn.lzm.server.tcp;

import cn.lzm.server.Server;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;
import io.vertx.core.parsetools.RecordParser;

/**
 * @author lzm
 * @Date 2024/11/5
 * @description 基于tcp协议的服务器 测试vertx来读取固定长度的消息
 */
public class VertxTcpServerV4 implements Server {

    @Override
    public void start(int port) {
        Vertx vertx = Vertx.vertx();
        // 创建TCP服务器
        NetServer server = vertx.createNetServer();
        server.connectHandler(socket -> {
            // 这里之所以固定为8， 是因为VertxTcpClientV3中用了2个int作为消息头，
            // 所以每次固定读取前8个字节就能够拿到完整的消息头
            RecordParser parser = RecordParser.newFixed(8);
            parser.setOutput(new Handler<>() {
                // 初始化
                int size = -1;

                // 一次完整的读取头和体
                Buffer resultBuf = Buffer.buffer();

                @Override
                public void handle(Buffer buffer) {
                    if (-1 == size) {
                        // 读取消息体的长度
                        size = buffer.getInt(4);
                        // 读取消息体
                        parser.fixedSizeMode(size);
                        // 将头信息写入到结果
                        resultBuf.appendBuffer(buffer);
                    } else {
                        // 将消息体写入到结果
                        resultBuf.appendBuffer(buffer);
                        System.out.println(resultBuf.toString());

                        // 重置一轮
                        parser.fixedSizeMode(8);
                        size = -1;
                        resultBuf = Buffer.buffer();
                    }
                }
            });
            socket.handler(parser);
        });

        server.listen(port, result -> {
            if (result.succeeded()) {
                System.out.println("Tcp server started on port " + port);
            } else {
                System.out.println("Failed to start Tcp server: " + result.cause());
            }
        });
    }

    public static void main(String[] args) {
        VertxTcpServerV4 tcpServer = new VertxTcpServerV4();
        tcpServer.start(8404);
    }

}
